浅谈SPDK
在上一篇写DSSD的文章里提到了SPDK,然后就有朋友问我相关的东西,其实我对SPDK的了解也并不深入,只是看过一些介绍文档,然后非常简单的测过一下。但既然被问到了,还是简单写一点内容吧。
SPDK的全称是Storage Performance Development Kits,是Intel为了改善存储性能而推出的开发套件,针对的主要是Linux操作系统环境,当然了,开源,网址如下:
http://www.spdk.io/
https://github.com/spdk/spdk
搞网络的朋友应该都知道DPDK,现在x86服务器平台上做高性能的网络包处理软件开发,几乎都会采用DPDK,而使用了DPDK的服务器上几乎一定都会指定需要使用Intel芯片的网卡。SPDK就是存储圈子里的DPDK,Intel推出SPDK的目的很简单,也是为了让大家更多的购买和使用Intel力推的NVMe接口SSD(包括使用3D Xpoint材料的Optane SSD),并为将要推出的使用3D Xpoint的NVDIMM(ApachePass) 做准备。
对于软件开发者来说,之所以需要使用SPDK,也正是因为新型的存储硬件性能进步太快,而传统存储软件堆栈的性能跟不上硬件发展的脚步,已经成为了瓶颈,所以就需要新的软件架构来进行革新。从下图存储系统中软硬件分别引入的延时比例比较就可以很明显的看到这个问题,简单来说,如果需要更高效率的使用NVMe接口的存储介质,你就需要考虑使用SPDK。
SPDK解决性能问题的思路跟DPDK基本上是一脉相承,大致就是:
Kernel Bypass 摒弃内核的低效处理方式,在用户态解决问题
Pull Mode Driver 摒弃中断模式的驱动,采用更高效率的轮循模式驱动
HugePage 使用大页表内存,避免内存拷贝造成的性能下降
NUMA和IOAT,充分利用硬件特性来提升性能
Lockless 使用各种无锁队列技术
而且SPDK的使用环境其实也依赖DPDK,因为有一些组件是共享使用的,也就是说想用SPDK,就先得装上DPDK
SPDK主要包含下列组件,这些组件的功能大致如下:
NVMe driver:用户态的NVMe 驱动,相比内核态NVMe驱动大幅度提升性能
I/OAT (DMA engine) driver:IOAT技术可以使用DMA引擎将数据在CPU和网卡的Cache之间直接进行拷贝提升性能
NVMe over Fabrics target:开源的NVMe over Fabric Target实现,单核最高可以处理40Gbps的流量
iSCSI target: 用户态的iSCSI target实现,相比Linux内核集成的LIO有约2倍的性能提升
vhost target:提供本地虚拟机(KVM/QEMU)访问SPDK NVMe存储
在SPDK最新的版本里还增加了块设备抽象层和BlobFS这种伪文件系统的支持
Block Device Abstraction Layer :在使用BDAL以后,SPDK可以通过扩展模块引入Intel的ISA-L库对存储进行各种处理,引入诸如类似RAID、去重、压缩、EraseCode以及加密等各种处理,也可以加入对NVDIMM的支持比如使用NVDIMM存放写日志等
Blobstore
BlobFS (Blobstore Filesystem)
在使用SPDK自带的用户态NVMe驱动时,根据Intel的说法,单核处理器就可以做到每秒处理360万IOPS性能,当然了,这360万IOPS性能需要用到8块P3700 NVMe SSD,毕竟单块P3700 SSD的最高性能也就只有46万。
Intel P3700 SSD 性能:
而在使用1-8块不同数量的P3700 SSD进行测试时,IO性能完全是呈线性增长的
我去年在我自己的机器上测到的性能提升大约在3倍左右,因为我的机器使用的还是老旧的PCIe 2.0接口,当IOPS达到42万时实际上瓶颈已经在PCIe通道的带宽上了,而如果使用系统自带的NVMe驱动,使用FIO测到的单线程4K随机写性能仅在14万左右,相信如果在使用PCIe 3.0接口的新机器上进行测试,IOPS性能提升会有大幅提高。
[root@centos7 perf]# ./perf -q 128 -s 4096 -w randwrite -t 10
========================================================
Latency(us)
Device Information : IOPS MB/s Average min max
HUSPR3216AHP301 (STM00019F9A1 ) from core 0: 418600.41 1635.16 305.68 43.16 6080.59
========================================================
Total : 418600.41 1635.16 305.68 43.16 6080.59
而在使用内核自带的LIO和SPDK的iSCSI Target软件进行对比测试时,在使用内存作为Backend进行测试时,IOPS性能从3万多上升到了5万多,倒也跟SPDK文档里宣称的近两倍性能提升接近。
至于NVMe over Fabric,因为需要准备的测试环境要求比较高,很惭愧,我也还没有玩过,等以后有机会能测一下了再跟大家分享吧。
以上内容,如有谬误,欢迎指正,您也可以直接在Intel官网上查看相关资料
https://software.intel.com/en-us/articles/introduction-to-the-storage-performance-development-kit-spdk
https://software.intel.com/en-us/articles/accelerating-your-nvme-drives-with-spdk